﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sispe.Entities;
using System.Data.Objects;

namespace Sispe.Repository
{
    class HojaDeRecorridoRepository : MasterRepository, IHojaDeRecorridoRepository
    {
        public void UpdateHojaRecorrido(HOJA_FIN_RECORRIDO_LIQUIDACIONES hojaRecorrido, int IdAreaLiquidacion)
        {
            hojaRecorrido.LIQUIDACION = null;

            if (IdAreaLiquidacion == 2) // RRHH
            {
                var fecha = "'" + hojaRecorrido.RRHH_Fecha.Date.ToShortDateString() + "'";
                int vistobueno = hojaRecorrido.RRHH_VistoBueno ? 1 : 0;
                int examenretiro = hojaRecorrido.RRHH_ExamenRetiro ? 1 : 0;
                int fotocheck = hojaRecorrido.RRHH_Fotocheck ? 1 : 0;
                int otros = hojaRecorrido.RRHH_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.RRHH_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.RRHH_OtrosComentario + "'";

                var queryRRHH = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET RRHH_VistoBueno = " + vistobueno + ", RRHH_Fecha = " + fecha + ", RRHH_ExamenRetiro = " + examenretiro + ", RRHH_Fotocheck = " + fotocheck + ", RRHH_Otros = " + otros + ", RRHH_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryRRHH);
            }
            else if (IdAreaLiquidacion == 3) // Operaciones
            {
                var fecha = "'" + hojaRecorrido.OP_Fecha.Date.ToShortDateString() + "'";
                int informedigital = hojaRecorrido.OP_InformeDigital ? 1 : 0;
                int informefisico = hojaRecorrido.OP_InformeFisico ? 1 : 0;
                int otros = hojaRecorrido.OP_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.OP_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.OP_OtrosComentario + "'";
                int vistobueno = hojaRecorrido.OP_VistoBueno ? 1 : 0;

                var queryOP = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET OP_VistoBueno = " + vistobueno + ", OP_Fecha = " + fecha + ", OP_InformeDigital = " + informedigital + ", OP_InformeFisico = " + informefisico + ", OP_Otros = " + otros + ", OP_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryOP);
            }
            else if (IdAreaLiquidacion == 4) // Logistica
            {
                var fecha = "'" + hojaRecorrido.LO_Fecha.Date.ToShortDateString() + "'";
                int vistobueno = hojaRecorrido.LO_VistoBueno ? 1 : 0;
                var queryLogistica = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET LO_VistoBueno = " + vistobueno + ", LO_Fecha = " + fecha + " WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryLogistica);
            }
            else if (IdAreaLiquidacion == 5) // Logistica Sistemas
            {
                var fecha = "'" + hojaRecorrido.LS_Fecha.Date.ToShortDateString() + "'";
                int laptop = hojaRecorrido.LS_Laptop ? 1 : 0;
                int desktop = hojaRecorrido.LS_Desktop ? 1 : 0;
                int otros = hojaRecorrido.LS_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.LS_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.LS_OtrosComentario + "'";
                int vistobueno = hojaRecorrido.LS_VistoBueno ? 1 : 0;

                var queryLS = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET LS_VistoBueno = " + vistobueno + ", LS_Fecha = " + fecha + ", LS_Laptop = " + laptop + ", LS_Desktop = " + desktop + ", LS_Otros = " + otros + ", LS_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryLS);

            }
            else if (IdAreaLiquidacion == 6) // Logistica Almacen
            {
                var fecha = "'" + hojaRecorrido.LA_Fecha.Date.ToShortDateString() + "'";
                int epp = hojaRecorrido.LA_EPP ? 1 : 0;
                var comentarioEPP = string.IsNullOrEmpty(hojaRecorrido.LA_EPPComentario) ? "'" + "'" : "'" + hojaRecorrido.LA_EPPComentario + "'";
                int otros = hojaRecorrido.LA_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.LA_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.LA_OtrosComentario + "'";
                int radio = hojaRecorrido.LA_Radio ? 1 : 0;
                int vistobueno = hojaRecorrido.LA_VistoBueno ? 1 : 0;

                var queryLA = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET LA_VistoBueno = " + vistobueno + ", LA_Fecha = " + fecha + ", LA_EPP = " + epp + ", LA_EPPComentario = " + comentarioEPP + ", LA_Radio = " + radio + ", LA_Otros = " + otros + ", LA_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryLA);

            }
            else if (IdAreaLiquidacion == 7) // Logistica Transportes
            {
                var fecha = "'" + hojaRecorrido.LT_Fecha.Date.ToShortDateString() + "'";
                int vehiculo = hojaRecorrido.LT_Vehiculo ? 1 : 0;
                int otros = hojaRecorrido.LT_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.LT_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.LT_OtrosComentario + "'";
                int vistobueno = hojaRecorrido.LT_VistoBueno ? 1 : 0;

                var queryLT = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET LT_VistoBueno = " + vistobueno + ", LT_Fecha = " + fecha + ", LT_Vehiculo = " + vehiculo + ", LT_Otros = " + otros + ", LT_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryLT);

            }
            else if (IdAreaLiquidacion == 8) // Adminsitracion
            {
                var fecha = "'" + hojaRecorrido.AD_Fecha.Date.ToShortDateString() + "'";
                int camara = hojaRecorrido.AD_Camara ? 1 : 0;
                int celular = hojaRecorrido.AD_Celular ? 1 : 0;
                int modem = hojaRecorrido.AD_Modem ? 1 : 0;
                int otros = hojaRecorrido.AD_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaRecorrido.AD_OtrosComentario) ? "'" + "'" : "'" + hojaRecorrido.AD_OtrosComentario + "'";
                int vistobueno = hojaRecorrido.AD_VistoBueno ? 1 : 0;

                var queryAD = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET AD_VistoBueno = " + vistobueno + ", AD_Fecha = " + fecha + ", AD_Camara = " + camara + ", AD_Celular = " + celular + ", AD_Modem = " + modem + ", AD_Otros = " + otros + ", AD_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryAD);
            }
            else if (IdAreaLiquidacion == 9) // Administracion General
            {
                var fecha = "'" + hojaRecorrido.ADGRAL_Fecha.Date.ToShortDateString() + "'";
                int vistobueno = hojaRecorrido.ADGRAL_VistoBueno ? 1 : 0;

                var queryADGRAL = "UPDATE HOJA_FIN_RECORRIDO_LIQUIDACIONES SET ADGRAL_Fecha = " + vistobueno + ", ADGRAL_Fecha = " + fecha + " WHERE IdLiquidacion = " + hojaRecorrido.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryADGRAL);
            }

            context.SaveChanges();
        }


        public HOJA_FIN_RECORRIDO_LIQUIDACIONES GetFromIdContrato(int idContrato)
        {
            var query = from p in context.HOJA_FIN_RECORRIDO_LIQUIDACIONES.Include("LIQUIDACION").Include("LIQUIDACION.CONTRATO").Include("LIQUIDACION.CONTRATO.ESPECIALIDAD").Include("HOJA_RECORRIDO_OPERACIONES")
                        where p.LIQUIDACION.IdContrato == idContrato
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }


        public HOJA_RECORRIDO_OPERACIONES GetFromHojaRecorridoOpByIdContrato(int idHojaLiquidacion)
        {
            var query = from p in context.HOJA_RECORRIDO_OPERACIONES.Include("HOJA_FIN_RECORRIDO_LIQUIDACIONES.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA").Include("HOJA_FIN_RECORRIDO_LIQUIDACIONES.LIQUIDACION.CONTRATO.ESPECIALIDAD").Include("HOJA_FIN_RECORRIDO_LIQUIDACIONES.LIQUIDACION.CONTRATO.ESPECIALIDAD.CATEGORIA")
                        where p.IdHojaRecorrido == idHojaLiquidacion
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }


        public void UpdateHojaOperaciones(HOJA_RECORRIDO_OPERACIONES hojaOperaciones)
        {
            hojaOperaciones.HOJA_FIN_RECORRIDO_LIQUIDACIONES = null;
            context.Entry(hojaOperaciones).State = System.Data.EntityState.Modified;
            context.SaveChanges();
        }


        public HOJA_RECORRIDO_OPERACIONES GetHojaRecorridoByIdLiquidacion(int idLiquidacion)
        {
            var query = from p in context.HOJA_RECORRIDO_OPERACIONES
                        where p.IdHojaRecorrido == idLiquidacion
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }


        public HOJA_FIN_RECORRIDO_OBRERO GetHojaRecorridoByIdContrato(int idContrato)
        {
            var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO.Include("LIQUIDACION").Include("LIQUIDACION.CONTRATO").Include("LIQUIDACION.CONTRATO.ESPECIALIDAD")
                        where p.LIQUIDACION.IdContrato == idContrato
                        select p;

            return query.SingleOrDefault();
        }

        public void UpdateHojaRecorridoObrero(HOJA_FIN_RECORRIDO_OBRERO hojaObrero, int IdAreaLiquidacion)
        {
            hojaObrero.LIQUIDACION = null;

            if (IdAreaLiquidacion == 2) // RRHH
            {
                var fecha = "'" + hojaObrero.RRHH_Fecha.Date.ToShortDateString() + "'";
                int vistobueno = hojaObrero.RRHH_VistoBueno ? 1 : 0;
                int examenretiro = hojaObrero.RRHH_ExamenRetiro ? 1 : 0;
                int fotocheck = hojaObrero.RRHH_Fotocheck ? 1 : 0;
                int otros = hojaObrero.RRHH_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaObrero.RRHH_OtrosComentario) ? "'" + "'" : "'" + hojaObrero.RRHH_OtrosComentario + "'";

                var queryRRHH = "UPDATE HOJA_FIN_RECORRIDO_OBRERO SET RRHH_VistoBueno = " + vistobueno + ", RRHH_Fecha = " + fecha + ", RRHH_ExamenRetiro = " + examenretiro + ", RRHH_Fotocheck = " + fotocheck + ", RRHH_Otros = " + otros + ", RRHH_OtrosComentario = " + comentario + "  WHERE IdLiquidacion = " + hojaObrero.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryRRHH);
            }
            else if (IdAreaLiquidacion == 6) // Logistica Almacen
            {
                var fecha = "'" + hojaObrero.AC_Fecha.Date.ToShortDateString() + "'";
                int epp = hojaObrero.AC_EPP ? 1 : 0;
                var comentarioEPP = string.IsNullOrEmpty(hojaObrero.AC_EPPCOmentario) ? "'" + "'" : "'" + hojaObrero.AC_EPPCOmentario + "'";
                int otros = hojaObrero.AC_Otros ? 1 : 0;
                var comentario = string.IsNullOrEmpty(hojaObrero.AC_OtrosComentario) ? "'" + "'" : "'" + hojaObrero.AC_OtrosComentario + "'";
                int herramientas = hojaObrero.AC_Herramientas ? 1 : 0;
                int equipos = hojaObrero.AC_EquiposVarios ? 1 : 0;
                int vistobueno = hojaObrero.AC_VistoBueno ? 1 : 0;

                var queryLA = "UPDATE HOJA_FIN_RECORRIDO_OBRERO SET AC_VistoBueno = " + vistobueno + ", AC_Fecha = " + fecha + ", AC_EPP = " + epp + ", AC_EPPCOmentario = " + comentarioEPP + ", AC_Herramientas = " + herramientas + ", AC_Otros = " + otros + ", AC_OtrosComentario = " + comentario + ", AC_EquiposVarios = " + equipos + "  WHERE IdLiquidacion = " + hojaObrero.IdLiquidacion + " ";

                context.Database.ExecuteSqlCommand(queryLA);

            }

            context.SaveChanges();
        }


        public List<HOJA_FIN_RECORRIDO_OBRERO> GetAllFromHojaRecorridoObrero()
        {
            var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO.Include("LIQUIDACION.CONTRATO").Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA").Include("LIQUIDACION.CONTRATO.PROYECTO")
                        where p.LIQUIDACION.CONTRATO.IdTipoPersonal == 3
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<HOJA_FIN_RECORRIDO_OBRERO> ListaLiquidacionObrero(int IdAreaLiquidacion)
        {
            if (IdAreaLiquidacion == 2) // RRHH
            {
                var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO
                            .Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA")
                            .Include("LIQUIDACION.CONTRATO.PROYECTO")
                            where p.RRHH_VistoBueno == false && p.LIQUIDACION.CONTRATO.IdTipoPersonal == 3
                            select p;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else if (IdAreaLiquidacion == 6) // Logistica Almacen
            {
                var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO
                            .Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA")
                            .Include("LIQUIDACION.CONTRATO.PROYECTO")
                            where p.AC_VistoBueno == false && p.LIQUIDACION.CONTRATO.IdTipoPersonal == 3
                            select p;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO
                            .Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA")
                            .Include("LIQUIDACION.CONTRATO.PROYECTO")
                            where p.LIQUIDACION.CONTRATO.IdTipoPersonal == 3
                            select p;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }


        public HOJA_FIN_RECORRIDO_OBRERO GetHojaObreroFromIdContrato(int idContrato)
        {
            var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO.Include("LIQUIDACION")
                            .Include("LIQUIDACION.CONTRATO")
                            .Include("LIQUIDACION.CONTRATO.PROYECTO")
                            .Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA")
                            .Include("LIQUIDACION.CONTRATO.ESPECIALIDAD")
                            .Include("LIQUIDACION.CONTRATO.ESPECIALIDAD.CATEGORIA")
                        where p.LIQUIDACION.IdContrato == idContrato
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }


        public List<HOJA_FIN_RECORRIDO_OBRERO> GetAllFromHojaRecorridoObrerosByCriterio(string criterio)
        {
            var query = from p in context.HOJA_FIN_RECORRIDO_OBRERO.Include("LIQUIDACION")
                            .Include("LIQUIDACION.CONTRATO")
                            .Include("LIQUIDACION.CONTRATO.PROYECTO")
                            .Include("LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA")
                        where p.LIQUIDACION.CONTRATO.PROYECTO.NombreProyecto.Contains(criterio.ToUpper())
                        || p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApePaterno.Contains(criterio.ToUpper())
                        || p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApeMaterno.Contains(criterio.ToUpper())
                        || (p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApePaterno + " " + p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApeMaterno).Contains(criterio.ToUpper())
                        || (p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApePaterno + " " + p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApeMaterno + " "+ p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.Nombres).Contains(criterio.ToUpper())
                        || (p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.Nombres + " " + p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApePaterno + " " + p.LIQUIDACION.CONTRATO.TRABAJADOR.PERSONA.ApeMaterno).Contains(criterio.ToUpper())
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }
    }
}
